package main

import "fmt"

/**
  切片

	其本身并不是数组，它指向底层的数组
	作为变长数组的替代方案，可以关联底层数组的局部或全部
	为引用类型
	可以直接创建或从底层数组获取生成
	使用len()获取元素个数，cap()获取容量
	一般使用make()创建
	如果多个slice指向相同底层数组，其中一个的值改变会影响全部

  make、new的区别
	1、make⽤用来分配引⽤用类型的内存，⽐如 map、slice以及channel
	2、new⽤用来分配除引⽤用类型的所有其他类型的内存，⽐如 int、数组等 ,new返回是一个指针
 */
func main() {

	//创建切片
	var slice1 []int = make([]int, 5)  //slice1 := make([]type, len)
	fmt.Println("创建切片：",slice1)

	//初始化切片
	s :=[] int {1,2,3 }
	fmt.Println("初始化切片：",s)

	s2 := new([]int)
	*s2 = []int{1,2,3}
	fmt.Println("使用new分配：",(*s2)[1])

	//arr := [] int{1,2,3}
	//slice2 := arr[0:]
	//fmt.Println(slice2)


	//numbers := []int{0,1,2,3,4,5,6,7,8}
	//printSlice(numbers)
	//
	//appendAndCopy()



	//var sa = make ([]string,5,10);
	//for i:=0;i<10;i++{
	//	sa=append(sa, fmt.Sprintf("%v",i))
	//}
	////[     0 1 2 3 4 5 6 7 8 9]
	//fmt.Println(sa);

}

func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

func appendAndCopy()  {
	var numbers []int
	printSlice(numbers)

	/* 允许追加空切片 */
	numbers = append(numbers, 0)
	printSlice(numbers)

	/* 向切片添加一个元素 */
	numbers = append(numbers, 1)
	printSlice(numbers)

	/* 同时添加多个元素 */
	numbers = append(numbers, 2,3,4)
	printSlice(numbers)

	/* 创建切片 numbers1 是之前切片的两倍容量*/
	numbers1 := make([]int, len(numbers), (cap(numbers))*2)

	/* 拷贝 numbers 的内容到 numbers1 */
	copy(numbers1,numbers)
	printSlice(numbers1)



}